/**
 * Project : Looker
 * Author  : solosky
 * File    : CategoryMonitorManager.java
 * Date    : 2009-4-9
 * Package : net.looker.monitor
 * Lisence : Apache License 2.0 
 */
package net.looker.monitor.schdule;

import java.util.ArrayList;
import java.util.Iterator;

import net.looker.config.ConfigManager;
import net.looker.config.SiteConfig;
import net.looker.data.Category;
import net.looker.work.WorkerPoolFactory;
/**
 * 监视管理器
 * 建立并管理监视器，使用单例模式
 * @author solosky
 */
public class MonitorManager
{

	/**
	 * 栏目监视器列表
	 */
	private volatile ArrayList<Monitor> monitorList;
	
	/**
	 * 监视计划器
	 * 启动监视器的定时检查
	 */
	private MonitorSchedule monitorSchedule;
	
	/**
	 * 监视管理器单例
	 */
	private static MonitorManager monitorManager = new MonitorManager();
	
	/**
	 * 返回实例
	 */
	public static MonitorManager getInstance()
	{
		return monitorManager;
	}
	
	/**
	 * 构造函数
	 */
	private MonitorManager()
	{
		monitorList = new ArrayList<Monitor>();
	}
	
	/**
	 * 建立所有的监视器
	 */
	public void buildMonitor()
	{
		//获取所有的配置，建立所有监视器对象
		SiteConfig siteConfig = null;
		Iterator<SiteConfig> it = ConfigManager.getInstance().getSiteConfigList().iterator();
		while (it.hasNext())
		{
			siteConfig = it.next();
			// 建立该站点下的所有的栏目监视器
			Iterator<Category> cateIt = siteConfig.getCategoryList().iterator();
			Category cate = null;
			while(cateIt.hasNext())
			{
				cate = cateIt.next();
				//添加栏目监视器之列表
				monitorList.add(new CategoryMonitor(cate));
				monitorList.add(new UpdaterMonitor(cate));
			}
		}
	}
	
	/**
	 * 开始监视
	 */
	public void startSchedule()
	{
		monitorSchedule = new MonitorSchedule(monitorList.size(), WorkerPoolFactory.get("looker"),monitorList);
		monitorSchedule.initSchedule();
		monitorSchedule.start();
	}
	
	/**
	 * 返回监视列表
	 * @return 
	 */
	public ArrayList<Monitor> getMonitorList()
	{
		
		return this.monitorList;
	}
	
	/**
	 * 返回当前计划器队列快照
	 */
	public WorkPoint[] getScheduleQueueSnap()
	{
		return this.monitorSchedule.getScheduleQueueSnap();
	}
}
